home *** CD-ROM | disk | FTP | other *** search
-
- #include <stdio.h>
-
- #include <search.h>
- #include <dos.h>
- #include <direct.h>
- #include <stdio.h>
- #include <string.h>
- #include <jstring.h>
-
- #include <glib.h>
-
- #include "init.h"
-
- union REGS inregs, outregs;
- struct SREGS segregs;
- extern int _DENGEROUS; /* 致命的エラー・フラグ 0 なら正常 */
-
-
- /* xy check return( yes=1, no=0 ) */
- int gfs_xychk(int x, int y, int x1, int y1, int x2, int y2)
- {
- if (x1<=x && x<=x2 && y1<=y && y<=y2) return(1);
- return(0);
- }
-
- #define MAXFILE 128 /* 最大表示ファイル数 */
- /*
- x, y = location x, y
- return normal(実行) = 0, esc(取消) = -1
- fselnam = ファイル・セレクターの名称
- dirnam = ディレクトリ, fnam = ファイル
- */
- int gfsel(int x, int y, char fselnam[], char dirnam[], char fnam[])
- {
- char dirbak[128], fnambak[13], dirwork[128];
- int drnbak;
- char drnam[3], flnam[13], fbuf[MAXFILE][13];
- int i, j, k, dircnt, inp1, pg, pgend, fsetno, dsetno, fend, fflag;
- unsigned drn, maxdr=0, maxdrive = 16; /* maxdrive は最大ドライブ数 */
- struct find_t dirbuf;
- char strw[16], *strww;
-
- unsigned ddadr[2];
- unsigned char page;
- char buf[27200]; /* (160*340+7)/8*4 図形バッファ */
- char chrbuf[500], atrbuf[2000]; /* キャラクタ・バッファ */
-
- int mx, my, com, lx, ly;
-
- struct diskfree_t stat;
- float dfree;
-
- union body {
- unsigned long dword;
- unsigned short word[2];
- } pcvt;
- char far *farchr;
-
- x = x / 8 * 8;
- y = y / 16 * 16;
-
- /* 文字データ退避 */
- VDB_rdarea( 1, x/8, y/16, x/8+20, y/16+21, chrbuf, atrbuf);
- VDB_clrarea(x/8, y/16, x/8+20, y/16+21); /* 矩形域消去 */
-
- color(0, 0);
- page = 0;
- BSETDATAADR(ddadr, buf);
- GDS_getBlock(ddadr[0], ddadr[1], page, x, y, x+154, y+335);
-
- /* 入力位置 */
- lx = (x+5+5) / 8; /* x は 8 の倍数でなければならない。 */
- ly = (y+272) / 16; /* y は 16 の倍数でなければならない。 */
-
- /* ウインドゥ */
- line(x, y, x+148, y+329, PSET, 7, 2, 0xffff);
- line(x, y, x+148, y+329, PSET, 1, 1, 0xffff);
- line(x, y, x+148, y+20, PSET, 1, 2, 0xffff);
- line(x+149, y+5, x+154, y+335, PSET, 0, 2, 0xffff);
- line(x+5, y+330, x+154, y+335, PSET, 0, 2, 0xffff);
- symbol_(x+5, y+2, fselnam, 1, 1, 14, 0, PSET);
-
- /* ドライブ名表示 */
- inregs.h.ah = 0x52; /* ファンクション・コード 内部変数領域番地獲得 */
- intdosx(&inregs, &outregs, &segregs);
- pcvt.word[1] = segregs.es;
- pcvt.word[0] = outregs.x.bx;
- farchr = (char far *)pcvt.dword;
- maxdrive = *(farchr+0x20);
- if (maxdrive > 16) maxdrive = 16;
-
- line(x+5, y+25, x+145, y+45, PSET, 0, 1, 0xffff);
- line(x+5, y+25, x+145, y+25, PSET, 15, 0, 0xffff);
- line(x+5, y+25, x+5, y+45, PSET, 15, 0, 0xffff);
- strw[1] = 0;
- for (i = 0; i < maxdrive; i++) {
- if (TOWNS == 0 || i != 2) { /* 機種がTOWNSの場合 C ドライブは無効 */
- strw[0] = 'A'+i;
- symbol(x+7+8*i, y+27, strw, 1, 2, 0, 0, PSET);
- }
- }
-
- /* ディレクトリ表示欄 */
- line(x+5, y+50, x+119, y+68, PSET, 0, 1, 0xffff);
- line(x+121, y+50, x+137, y+68, PSET, 0, 1, 0xffff);
- line(x+121, y+50, x+137, y+50, PSET, 15, 0, 0xffff);
- line(x+121, y+50, x+121, y+68, PSET, 15, 1, 0xffff);
- symbol_(x+122, y+50, "↑", 1, 1, 0, 0, PSET);
-
- /* _dos_getdrive(&drn); */
-
- /* 前頁・後頁 */
- line(x+73, y+73, x+104, y+89, PSET, 0, 1, 0xffff);
- line(x+73, y+73, x+104, y+73, PSET, 15, 0, 0xffff);
- line(x+73, y+73, x+ 73, y+89, PSET, 15, 0, 0xffff);
- line(x+106, y+73, x+137, y+89, PSET, 0, 1, 0xffff);
- line(x+106, y+73, x+137, y+73, PSET, 15, 0, 0xffff);
- line(x+106, y+73, x+106, y+89, PSET, 15, 0, 0xffff);
- symbol_(x+74, y+73, "前頁", 1, 1, 0, 0, PSET);
- symbol_(x+107, y+73, "後頁", 1, 1, 0, 0, PSET);
-
- /* ディスク残容量 */
- line(x+5, y+73, x+71, y+89, PSET, 0, 1, 0xffff);
-
- /* ファイル表示一欄 */
- line(x+5, y+91, x+121, y+263, PSET, 0, 1, 0xffff);
- line(x+5, y+91, x+121, y+ 91, PSET, 15, 0, 0xffff);
- line(x+5, y+91, x+5 , y+263, PSET, 15, 0, 0xffff);
-
- /* スクロール・バー */
- line(x+121, y+91, x+137, y+263, PSET, 0, 1, 0xffff);
-
- /* ファイル名表示欄 (入力欄) */
- line(x+5, y+269, x+105, y+289, PSET, 0, 1, 0xffff);
- line(x+5, y+269, x+105, y+269, PSET, 15, 0, 0xffff);
- line(x+5, y+269, x+5, y+289, PSET, 15, 0, 0xffff);
- locate(lx, ly, COFF);
- printf("%s\n", fnam);
-
- /* 実行・取消 */
- line(x+60, y+299, x+96, y+317, PSET, 0, 1, 0xffff);
- line(x+60, y+299, x+96, y+299, PSET, 15, 0, 0xffff);
- line(x+60, y+299, x+60, y+317, PSET, 15, 0, 0xffff);
- line(x+101, y+299, x+137, y+317, PSET, 0, 1, 0xffff);
- line(x+101, y+299, x+137, y+299, PSET, 15, 0, 0xffff);
- line(x+101, y+299, x+101, y+317, PSET, 15, 0, 0xffff);
- symbol_(x+63, y+299, "実行", 1, 1, 0, 0, PSET);
- symbol_(x+104, y+299, "取消", 1, 1, 0, 0, PSET);
-
- strcpy(fnambak, fnam); /* バックアップ */
- strcpy(dirbak, dirnam); /* バックアップ */
- getcwd(dirnam, 64); /* カレント・ディレクトリ */
- dsetno = dirnam[0]-'A'; /* ドライブ番号 */
- drnbak = dsetno;
-
- /* _dos_setdrive(dsetno+1, &maxdr); / * ドライブ設定 & 使用可能なドライブ数取得 */
- /* ↑実際には使用可能なドライブが返ってこない。バグ? */
-
- fflag = 1;
- for (;;) { /* loop */
- if (fflag == 1) { /* 条件成立ならディレクトリ・ファイル検索 */
- getcwd(dirnam, 64);
- if (_DENGEROUS != 0) { /* 致命的エラー・フラグ 0 なら正常 */
- line(x+6, y+74, x+70, y+88, PSET, 7, 2, 0xffff); /* ディスク残容量表示消去 */
- line(x+6, y+51, x+118, y+67, PSET, 7, 2, 0xffff); /* ディレクトリ表示消去 */
- line(x+6, y+92, x+120, y+262, PSET, 7, 2, 0xffff); /* ファイル一覧消去 */
- line(x+122, y+92, x+136, y+262, PSET, 8, 2, 0xffff); /* スクロール・バー消去 */
- fflag = 90;
- continue; /* エラー発生ならコマンド選択 */
- }
- strw[0] = 'A'+dsetno; strw[1] = 0;
- line(x+7+8*dsetno, y+27, x+15+8*dsetno, y+42, PSET, 7, 2, 0xffff);
- symbol(x+7+8*dsetno, y+27, strw, 1, 2, 0, 0, PSET); /* ドライブ名消去 */
-
- strcpy(dirwork, dirnam); /* カレント・ディレクトリ退避 */
- dsetno = dirnam[0]-'A'; /* ドライブ番号 */
- line(x+7+8*dsetno, y+27, x+15+8*dsetno, y+42, XOR, 15, 2, 0xffff); /* ドライブ名設定 */
- _dos_getdiskfree(0, &stat);
- dfree = (float)stat.avail_clusters * (float)stat.sectors_per_cluster * (float)stat.bytes_per_sector;
- dfree = dfree / 1024.0;
- if (dfree > 1024.0) {
- dfree = dfree / 1024.0;
- sprintf(strw, "%6.1fMB", dfree);
- } else {
- sprintf(strw, "%6.1fKB", dfree);
- }
- /* ディスク残容量表示 */
- line(x+6, y+74, x+70, y+88, PSET, 7, 2, 0xffff);
- symbol(x+7, y+73, strw, 1, 2, 0, 0, PSET);
- }
- if (fflag <= 2) {
- getcwd(dirnam, 64);
- /* サブ・ディレクトリ 検索 */
- i = 0;
- strcpy(flnam, "*.*");
- if ( _dos_findfirst( flnam, _A_SUBDIR, &dirbuf ) == 0 && (dirbuf.attrib & _A_SUBDIR) != 0) {
- strcpy(fbuf[i], dirbuf.name);
- i++;
- }
- while ( _dos_findnext(&dirbuf) == 0 && i < MAXFILE) {
- if ( ( dirbuf.attrib & _A_SUBDIR ) != 0 ) {
- strcpy(fbuf[i], dirbuf.name);
- i++;
- }
- }
- dircnt = i; /* サブ・ディレクトリの数 */
- qsort(fbuf[0], dircnt, 13, jstrcmp);
-
- /* ファイル検索 */
- strcpy(flnam, "*.*"); /* *.xxx */
- if ( _dos_findfirst( flnam, _A_NORMAL, &dirbuf) == 0 && i < MAXFILE) {
- strcpy(fbuf[i], dirbuf.name);
- i++;
- }
- while ( _dos_findnext(&dirbuf) == 0 && i < MAXFILE) {
- strcpy(fbuf[i], dirbuf.name);
- i++;
- }
- fend = i; /* ファイルの数 */
- if (i == 0) pgend = 0; /* 終了頁 ファイルが 0 ならば 1 頁 */
- else pgend = (fend - 1) / 10; /* 終了頁 */
- qsort(fbuf[dircnt], fend-dircnt, 13, jstrcmp);
-
- pg = 0; fsetno = 0;
- line(x+6, y+51, x+118, y+67, PSET, 7, 2, 0xffff); /* ディレクトリ表示消去 */
- strww = strrchr(dirnam, '\\');
- symbol_(x+7, y+51, strww+1, 1, 1, 0, 0, PSET);
- }
-
- if ((fflag <= 3) || (fflag == 30)) { /* 条件成立ならファイル表示 */
- line(x+122, y+92, x+136, y+262, PSET, 8, 2, 0xffff); /* スクロール・バー消去 */
- i = 170 / (pgend + 1);
- if (pg != pgend) {
- line(x+123, y+93+i*pg, x+135, y+91+i*(pg+1), PSET, 7, 2, 0xffff);
- line(x+123, y+93+i*pg, x+135, y+91+i*(pg+1), PSET, 0, 1, 0xffff);
- line(x+123, y+93+i*pg, x+135, y+93+i*pg, PSET, 15, 0, 0xffff);
- line(x+123, y+93+i*pg, x+123, y+91+i*(pg+1), PSET, 15, 0, 0xffff);
- } else {
- line(x+123, y+93+i*pg, x+135, y+261, PSET, 7, 2, 0xffff);
- line(x+123, y+93+i*pg, x+135, y+261, PSET, 0, 1, 0xffff);
- line(x+123, y+93+i*pg, x+135, y+93+i*pg, PSET, 15, 0, 0xffff);
- line(x+123, y+93+i*pg, x+123, y+261, PSET, 15, 0, 0xffff);
- }
-
- line(x+6, y+92, x+120, y+262, PSET, 7, 2, 0xffff); /* ファイル一覧消去 */
- k = 10*pg;
- for (i = k; i < k+10; i++) {
- if (i < fend) {
- if (i < dircnt) sprintf(strw, "<%s>\n", fbuf[i]); /* directry */
- else sprintf(strw, "%s\n", fbuf[i]); /* file */
- symbol_(x+7, y+93+17*(i-k), strw, 1, 1, 0, 0, PSET);
- }
- }
- }
-
- if (fflag == 4) { /* 条件成立ならファイル名入力 */
- /* MOS_disp(1); */
- locate(lx, ly, CON);
- i = sedline( lx, ly, fnam, 12);
- locate(lx, ly, COFF);
- /* MOS_disp(0); */
- /*
- if (i == 0x1b) {
- GDS_putBlock(ddadr[0], ddadr[1], page, x, y, x+154, y+335, PSET);
- return(0);
- }
- i = strlen(fnam);
- */
- }
-
- if (fflag == 99 || fflag == 98) {
- /* グラフィック・データ復帰 */
- GDS_putBlock(ddadr[0], ddadr[1], page, x, y, x+154, y+335, PSET);
- /* 文字データ復帰 */
- VDB_setarea( 1, x/8, y/16, x/8+20, y/16+21, chrbuf, atrbuf);
- color(7, 0);
- locate(0, 0, CON);
- chdir(dirwork); /* カレント・ディレクトリ復帰 */
- _dos_setdrive((unsigned)(drnbak+1), &maxdr); /* カレント・ドライブ復帰 */
- if (fflag == 99) return(0); /* 実行 */
- if (fflag == 98) { /* 取消 */
- strcpy(dirnam, dirbak);
- strcpy(fnam, fnambak);
- return(-1);
- }
- }
-
- /* コマンド選択 */
- fflag = 0;
- while (fflag == 0) {
- while ((MOS_rdpos(&mx, &my) & 0x01) == 0);
- for (;;) {
- if (gfs_xychk(mx, my, x+7, y+25, x+14+8*15, y+45) != 0) { /* ドライブ変更 A~P */
- for(i = 0; i < maxdrive; i++) {
- if (gfs_xychk(mx, my, x+7+8*i, y+25, x+14+8*i, y+45) != 0) break;
- }
- if (i == maxdrive) break;
- if (TOWNS == 1 && i == 2) break; /* TOWNSの場合には C ドライブが使用不可 */
- line(x+7+8*dsetno, y+27, x+15+8*dsetno, y+42, XOR, 15, 2, 0xffff); /* 前ドライブ消去 */
- line(x+7+8*i, y+27, x+15+8*i, y+42, XOR, 15, 2, 0xffff); /* ドライブ設定 */
- while ((MOS_rdpos(&mx, &my) & 0x01) == 1);
- if (gfs_xychk(mx, my, x+7+8*i, y+25, x+14+8*i, y+45) == 0) {
- line(x+7+8*i, y+27, x+15+8*i, y+42, XOR, 15, 2, 0xffff);
- line(x+7+8*dsetno, y+27, x+15+8*dsetno, y+42, XOR, 15, 2, 0xffff);
- break;
- }
- if (_DENGEROUS != 0) _DENGEROUS = 0;
- else chdir(dirwork); /* ドライブ変更の場合はカレント・ディレクトリ復帰 */
- dsetno = i;
- _dos_setdrive(dsetno+1, &maxdr); /* ドライブ設定 */
- /*
- locate(0, 0, COFF);
- printf("%d\n", maxdr); 最大論理ドライブ印字。但しバグのため26だけ返る
- */
- fflag = 1;
- break;
- }
- if (_DENGEROUS != 0) break; /* ドライブ選択エラー発生の場合は正しいドライブに変更が必要 */
-
- if (gfs_xychk(mx, my, x+121, y+50, x+137, y+68) != 0) { /* ディレクトリ・アップ */
- line(x+121, y+50, x+137, y+68, XOR, 15, 1, 0xffff);
- while ((MOS_rdpos(&mx, &my) & 0x01) == 1);
- line(x+121, y+50, x+137, y+68, XOR, 15, 1, 0xffff);
- if (gfs_xychk(mx, my, x+121, y+50, x+137, y+68) == 0) break;
- chdir(".."); /* ディレクトリ・アップ */
- fflag = 2;
- break;
- }
- if (gfs_xychk(mx, my, x+73, y+73, x+104, y+89) != 0) { /* 前頁 */
- line(x+73, y+73, x+104, y+89, XOR, 15, 1, 0xffff);
- while ((MOS_rdpos(&mx, &my) & 0x01) == 1);
- line(x+73, y+73, x+104, y+89, XOR, 15, 1, 0xffff);
- if (gfs_xychk(mx, my, x+73, y+73, x+104, y+89) == 0) break;
- if (pg != 0) {
- pg--;
- fflag = 30;
- }
- break;
- }
- if (gfs_xychk(mx, my, x+106, y+73, x+137, y+89) != 0) { /* 後頁 */
- line(x+106, y+73, x+137, y+89, XOR, 15, 1, 0xffff);
- while ((MOS_rdpos(&mx, &my) & 0x01) == 1);
- line(x+106, y+73, x+137, y+89, XOR, 15, 1, 0xffff);
- if (gfs_xychk(mx, my, x+106, y+73, x+137, y+89) == 0) break;
- if (pg < pgend) {
- pg++;
- fflag = 30;
- }
- break;
- }
- if (gfs_xychk(mx, my, x+5, y+92, x+120, y+263) != 0) { /* ファイル表示一欄 */
- k = 10*pg;
- for (i = k; i < k+10; i++) {
- j = i - k;
- if (gfs_xychk(mx, my, x+5, y+92+17*j, x+120, y+92+17*(j+1)) != 0) break;
- }
- if (i >= fend) break;
- line(x+6, y+92+17*j, x+120, y+92+17*(j+1), XOR, 15, 2, 0xffff); /* ファイル反転 */
- while ((MOS_rdpos(&mx, &my) & 0x01) == 1);
- line(x+6, y+92+17*j, x+120, y+92+17*(j+1), XOR, 15, 2, 0xffff); /* ファイル反転 */
- if (gfs_xychk(mx, my, x+5, y+92+17*j, x+120, y+92+17*(j+1)) == 0) {
- break;
- }
- if ( i < dircnt) { /* ディレクトリなら変更 */
- chdir(fbuf[i]);
- pg = 0;
- fflag = 2;
- } else {
- strcpy(fnam, fbuf[i]);
- locate(lx, ly, COFF);
- printf(" \n");
- locate(lx, ly, COFF);
- printf("%s\n", fnam);
- }
- break;
- }
-
- if (gfs_xychk(mx, my, x+121, y+92, x+137, y+263) != 0) { /* スクロール・バー */
- line(x+122, y+92, x+136, y+262, PSET, 8, 2, 0xffff); /* スクロール・バー消去 */
- i = 170 / (pgend + 1);
- while ((MOS_rdpos(&mx, &my) & 0x01) == 1);
- for (j = 0; j <= pgend; j++) {
- if (gfs_xychk(mx, my, x+121, y+92+i*j, x+137, y+92+i*(j+1)) != 0) break;
- }
- if (j > pgend) { /* 頁変更無し */
- fflag = 30;
- break;
- }
- if (pg != pgend) line(x+122, y+92+i*j, x+136, y+92+i*(j+1), PSET, 7, 2, 0xffff);
- else line(x+122, y+92+i*j, x+136, y+262, PSET, 7, 2, 0xffff);
- pg = j;
- fflag = 30;
- break;
- }
- if (gfs_xychk(mx, my, x+5, y+271, x+105, y+291) != 0) { /* ファイル名表示欄 (入力欄) */
- while ((MOS_rdpos(&mx, &my) & 0x01) == 1);
- if (gfs_xychk(mx, my, x+5, y+271, x+105, y+291) == 0) break;
- fflag = 4;
- }
- if (gfs_xychk(mx, my, x+60, y+299, x+96, y+317) != 0) { /* 実行 */
- line(x+60, y+299, x+96, y+317, XOR, 15, 1, 0xffff);
- while ((MOS_rdpos(&mx, &my) & 0x01) == 1);
- line(x+60, y+299, x+96, y+317, XOR, 15, 1, 0xffff);
- if (gfs_xychk(mx, my, x+59, y+299, x+95, y+317) == 0) {
- break;
- }
- fflag = 99;
- break;
- }
- if (gfs_xychk(mx, my, x+101, y+299, x+137, y+317) != 0) { /* 取消 */
- line(x+101, y+299, x+137, y+317, XOR, 15, 1, 0xffff);
- while ((MOS_rdpos(&mx, &my) & 0x01) == 1);
- line(x+101, y+299, x+137, y+317, XOR, 15, 1, 0xffff);
- if (gfs_xychk(mx, my, x+101, y+299, x+137, y+317) == 0) {
- break;
- }
- fflag = 98;
- break;
- }
- break;
- }
- } /* wend fflag == 0 */
- } /* loop end */
- } /* end */
-